<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml/3.2" targetNamespace="http://www.opengis.net/gml/3.2" elementFormDefault="qualified" version="3.2.1.2">
	<annotation>
		<appinfo source="urn:x-ogc:specification:gml:schema-xsd:coverage:3.2.1">coverage.xsd</appinfo>
		<documentation>See ISO/DIS 19136 20.3.
A coverage incorporates a mapping from a spatiotemporal domain to a range set, the latter providing the set in which the attribute values live.  The range set may be an arbitrary set including discrete lists, integer or floating point ranges, and multi-dimensional vector spaces.
A coverage can be viewed as the graph of the coverage function f:A à B, that is as the set of ordered pairs {(x, f(x)) | where x is in A}. This view is especially applicable to the GML encoding of a coverage.  In the case of a discrete coverage, the domain set A is partitioned into a collection of subsets (typically a disjoint collection) A = UAi and the function f is constant on each Ai. For a spatial domain, the Ai are geometry elements, hence the coverage can be viewed as a collection of (geometry,value) pairs, where the value is an element of the range set.  If the spatial domain A is a topological space then the coverage can be viewed as a collection of (topology,value) pairs, where the topology element in the pair is a topological n-chain (in GML terms this is a gml:TopoPoint, gml:TopoCurve, gml:TopoSurface or gml:TopoSolid). 
A coverage is implemented as a GML feature. We can thus speak of a "temperature distribution feature", or a "remotely sensed image feature", or a "soil distribution feature".
As is the case for any GML object, a coverage object may also be the value of a property of a feature.

GML is an OGC Standard.
Copyright (c) 2007,2010 Open Geospatial Consortium.
To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
		</documentation>
	</annotation>
	<!--<include schemaLocation="gml.xsd"/>-->
	<include schemaLocation="feature.xsd"/>
	<include schemaLocation="valueObjects.xsd"/>
	<include schemaLocation="grids.xsd"/>
	<include schemaLocation="geometryAggregates.xsd"/>
	<complexType name="AbstractCoverageType" abstract="true">
		<annotation>
			<documentation>The base type for coverages is gml:AbstractCoverageType. The basic elements of a coverage can be seen in this content model: the coverage contains gml:domainSet and gml:rangeSet properties. The gml:domainSet property describes the domain of the coverage and the gml:rangeSet property describes the range of the coverage.</documentation>
		</annotation>
		<complexContent>
			<extension base="gml:AbstractFeatureType">
				<sequence>
					<element ref="gml:domainSet"/>
					<element ref="gml:rangeSet"/>
				</sequence>
			</extension>
		</complexContent>
	</complexType>
	<element name="AbstractCoverage" type="gml:AbstractCoverageType" abstract="true" substitutionGroup="gml:AbstractFeature">
		<annotation>
			<documentation>This element serves as the head of a substitution group which may contain any coverage whose type is derived from gml:AbstractCoverageType.  It may act as a variable in the definition of content models where it is required to permit any coverage to be valid.</documentation>
		</annotation>
	</element>
	<complexType name="DiscreteCoverageType">
		<complexContent>
			<extension base="gml:AbstractCoverageType">
				<sequence>
					<element ref="gml:coverageFunction" minOccurs="0"/>
				</sequence>
			</extension>
		</complexContent>
	</complexType>
	<element name="AbstractDiscreteCoverage" type="gml:DiscreteCoverageType" abstract="true" substitutionGroup="gml:AbstractCoverage">
		<annotation>
			<documentation>A discrete coverage consists of a domain set, range set and optionally a coverage function. The domain set consists of either spatial or temporal geometry objects, finite in number. The range set is comprised of a finite number of attribute values each of which is associated to every direct position within any single spatiotemporal object in the domain. In other words, the range values are constant on each spatiotemporal object in the domain. This coverage function maps each element from the coverage domain to an element in its range. The coverageFunction element describes the mapping function.
This element serves as the head of a substitution group which may contain any discrete coverage whose type is derived from gml:DiscreteCoverageType.</documentation>
		</annotation>
	</element>
	<complexType name="AbstractContinuousCoverageType" abstract="true">
		<complexContent>
			<extension base="gml:AbstractCoverageType">
				<sequence>
					<element ref="gml:coverageFunction" minOccurs="0"/>
				</sequence>
			</extension>
		</complexContent>
	</complexType>
	<element name="AbstractContinuousCoverage" type="gml:AbstractContinuousCoverageType" abstract="true" substitutionGroup="gml:AbstractFeature">
		<annotation>
			<documentation>A continuous coverage as defined in ISO 19123 is a coverage that can return different values for the same feature attribute at different direct positions within a single spatiotemporal object in its spatiotemporal domain. The base type for continuous coverages is AbstractContinuousCoverageType.
The coverageFunction element describes the mapping function. 
The abstract element gml:AbstractContinuousCoverage serves as the head of a substitution group which may contain any continuous coverage whose type is derived from gml:AbstractContinuousCoverageType.</documentation>
		</annotation>
	</element>
	<element name="domainSet" type="gml:DomainSetType">
		<annotation>
			<documentation>The gml:domainSet property element describes the spatio-temporal region of interest, within which the coverage is defined. Its content model is given by gml:DomainSetType.
The value of the domain is thus a choice between a gml:AbstractGeometry and a gml:AbstractTimeObject.  In the instance these abstract elements will normally be substituted by a geometry complex or temporal complex, to represent spatial coverages and time-series, respectively.  
The presence of the gml:AssociationAttributeGroup means that domainSet follows the usual GML property model and may use the xlink:href attribute to point to the domain, as an alternative to describing the domain inline. Ownership semantics may be provided using the gml:OwnershipAttributeGroup.
</documentation>
		</annotation>
	</element>
	<complexType name="DomainSetType">
		<sequence minOccurs="0">
			<choice>
				<element ref="gml:AbstractGeometry"/>
				<element ref="gml:AbstractTimeObject"/>
			</choice>
		</sequence>
		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
		<attributeGroup ref="gml:AssociationAttributeGroup"/>
	</complexType>
	<element name="rangeSet" type="gml:RangeSetType">
		<annotation>
			<documentation>The gml:rangeSet property element contains the values of the coverage (sometimes called the attribute values).  Its content model is given by gml:RangeSetType.
This content model supports a structural description of the range.  The semantic information describing the range set is embedded using a uniform method, as part of the explicit values, or as a template value accompanying the representation using gml:DataBlock and gml:File.
The values from each component (or "band") in the range may be encoded within a gml:ValueArray element or a concrete member of the gml:AbstractScalarValueList substitution group . Use of these elements satisfies the value-type homogeneity requirement.</documentation>
		</annotation>
	</element>
	<complexType name="RangeSetType">
		<choice>
			<element ref="gml:ValueArray" maxOccurs="unbounded"/>
			<element ref="gml:AbstractScalarValueList" maxOccurs="unbounded"/>
			<element ref="gml:DataBlock"/>
			<element ref="gml:File"/>
		</choice>
	</complexType>
	<element name="DataBlock" type="gml:DataBlockType" substitutionGroup="gml:AbstractObject">
		<annotation>
			<documentation>gml:DataBlock describes the Range as a block of text encoded values similar to a Common Separated Value (CSV) representation.
The range set parameterization is described by the property gml:rangeParameters.</documentation>
		</annotation>
	</element>
	<complexType name="DataBlockType">
		<sequence>
			<element ref="gml:rangeParameters"/>
			<choice>
				<element ref="gml:tupleList"/>
				<element ref="gml:doubleOrNilReasonTupleList"/>
			</choice>
		</sequence>
	</complexType>
	<element name="rangeParameters" type="gml:AssociationRoleType"/>
	<element name="tupleList" type="gml:CoordinatesType">
		<annotation>
			<documentation>gml:CoordinatesType consists of a list of coordinate tuples, with each coordinate tuple separated by the ts or tuple separator (whitespace), and each coordinate in the tuple by the cs or coordinate separator (comma).
The gml:tupleList encoding is effectively "band-interleaved".</documentation>
		</annotation>
	</element>
	<element name="doubleOrNilReasonTupleList" type="gml:doubleOrNilReasonList">
		<annotation>
			<documentation>gml:doubleOrNilReasonList consists of a list of gml:doubleOrNilReason values, each separated by a whitespace. The gml:doubleOrNilReason values are grouped into tuples where the dimension of each tuple in the list is equal to the number of range parameters.</documentation>
		</annotation>
	</element>
	<element name="File" type="gml:FileType" substitutionGroup="gml:AbstractObject">
		<annotation>
			<documentation>for efficiency reasons, GML also provides a means of encoding the range set in an arbitrary external encoding, such as a binary file.  This encoding may be "well-known" but this is not required. This mode uses the gml:File element.
The values of the coverage (attribute values in the range set) are transmitted in a external file that is referenced from the XML structure described by gml:FileType.  The external file is referenced by the gml:fileReference property that is an anyURI (the gml:fileName property has been deprecated).  This means that the external file may be located remotely from the referencing GML instance. 
The gml:compression property points to a definition of a compression algorithm through an anyURI.  This may be a retrievable, computable definition or simply a reference to an unambiguous name for the compression method.
The gml:mimeType property points to a definition of the file mime type.
The gml:fileStructure property is defined by a codelist. Note further that all values shall be enclosed in a single file. Multi-file structures for values are not supported in GML.
The semantics of the range set is described as above using the gml:rangeParameters property.
Note that if any compression algorithm is applied, the structure above applies only to the pre-compression or post-decompression structure of the file.
Note that the fields within a record match the gml:valueComponents of the gml:CompositeValue in document order.</documentation>
		</annotation>
	</element>
	<complexType name="FileType">
		<sequence>
			<element ref="gml:rangeParameters"/>
			<choice>
				<element name="fileName" type="anyURI">
					<annotation>
						<appinfo>deprecated</appinfo>
					</annotation>
				</element>
				<element name="fileReference" type="anyURI"/>
			</choice>
			<element name="fileStructure" type="gml:CodeType"/>
			<element name="mimeType" type="anyURI" minOccurs="0"/>
			<element name="compression" type="anyURI" minOccurs="0"/>
		</sequence>
	</complexType>
	<element name="coverageFunction" type="gml:CoverageFunctionType" substitutionGroup="gml:AbstractObject">
		<annotation>
			<documentation>The gml:coverageFunction property describes the mapping function from the domain to the range of the coverage.
The value of the CoverageFunction is one of gml:CoverageMappingRule and gml:GridFunction.
If the gml:coverageFunction property is omitted for a gridded coverage (including rectified gridded coverages) the gml:startPoint is assumed to be the value of the gml:low property in the gml:Grid geometry, and the gml:sequenceRule is assumed to be linear and the gml:axisOrder property is assumed to be "+1 +2".</documentation>
		</annotation>
	</element>
	<complexType name="CoverageFunctionType">
		<choice>
			<element ref="gml:MappingRule"/>
			<element ref="gml:CoverageMappingRule"/>
			<element ref="gml:GridFunction"/>
		</choice>
	</complexType>
	<element name="CoverageMappingRule" type="gml:MappingRuleType" substitutionGroup="gml:AbstractObject">
		<annotation>
			<documentation>gml:CoverageMappingRule provides a formal or informal description of the coverage function.
The mapping rule may be defined as an in-line string (gml:ruleDefinition) or via a remote reference through xlink:href (gml:ruleReference).  
If no rule name is specified, the default is 'Linear' with respect to members of the domain in document order.</documentation>
		</annotation>
	</element>
	<complexType name="MappingRuleType" final="#all">
		<choice>
			<element name="ruleDefinition" type="string"/>
			<element name="ruleReference" type="gml:ReferenceType"/>
		</choice>
	</complexType>
	<element name="GridFunction" type="gml:GridFunctionType" substitutionGroup="gml:AbstractObject">
		<annotation>
			<documentation>gml:GridFunction provides an explicit mapping rule for grid geometries, i.e. the domain shall be a geometry of type grid.  It describes the mapping of grid posts (discrete point grid coverage) or grid cells (discrete surface coverage) to the values in the range set.
The gml:startPoint is the index position of a point in the grid that is mapped to the first point in the range set (this is also the index position of the first grid post).  If the gml:startPoint property is omitted the gml:startPoint is assumed to be equal to the value of gml:low in the gml:Grid geometry. Subsequent points in the mapping are determined by the value of the gml:sequenceRule.</documentation>
		</annotation>
	</element>
	<complexType name="GridFunctionType">
		<sequence>
			<element name="sequenceRule" type="gml:SequenceRuleType" minOccurs="0"/>
			<element name="startPoint" type="gml:integerList" minOccurs="0"/>
		</sequence>
	</complexType>
	<complexType name="SequenceRuleType">
		<annotation>
			<documentation>The gml:SequenceRuleType is derived from the gml:SequenceRuleEnumeration through the addition of an axisOrder attribute.  The gml:SequenceRuleEnumeration is an enumerated type. The rule names are defined in ISO 19123. If no rule name is specified the default is "Linear".</documentation>
		</annotation>
		<simpleContent>
			<extension base="gml:SequenceRuleEnumeration">
				<attribute name="order" type="gml:IncrementOrder">
					<annotation>
						<appinfo>deprecated</appinfo>
					</annotation>
				</attribute>
				<attribute name="axisOrder" type="gml:AxisDirectionList"/>
			</extension>
		</simpleContent>
	</complexType>
	<simpleType name="SequenceRuleEnumeration">
		<restriction base="string">
			<enumeration value="Linear"/>
			<enumeration value="Boustrophedonic"/>
			<enumeration value="Cantor-diagonal"/>
			<enumeration value="Spiral"/>
			<enumeration value="Morton"/>
			<enumeration value="Hilbert"/>
		</restriction>
	</simpleType>
	<simpleType name="AxisDirectionList">
		<annotation>
			<documentation>The different values in a gml:AxisDirectionList indicate the incrementation order to be used on all axes of the grid. Each axis shall be mentioned once and only once.</documentation>
		</annotation>
		<list itemType="gml:AxisDirection"/>
	</simpleType>
	<simpleType name="AxisDirection">
		<annotation>
			<documentation>The value of a gml:AxisDirection indicates the incrementation order to be used on an axis of the grid.</documentation>
		</annotation>
		<restriction base="string">
			<pattern value="[\+\-][1-9][0-9]*"/>
		</restriction>
	</simpleType>
	<element name="MultiPointCoverage" type="gml:DiscreteCoverageType" substitutionGroup="gml:AbstractDiscreteCoverage">
		<annotation>
			<documentation>In a gml:MultiPointCoverage the domain set is a gml:MultiPoint, that is a collection of arbitrarily distributed geometric points.
The content model is identical with gml:DiscreteCoverageType, but that gml:domainSet shall have values gml:MultiPoint.
In a gml:MultiPointCoverage the mapping from the domain to the range is straightforward.
-	For gml:DataBlock encodings the points of the gml:MultiPoint are mapped in document order to the tuples of the data block.
-	For gml:CompositeValue encodings the points of the gml:MultiPoint are mapped to the members of the composite value in document order.
-	For gml:File encodings the points of the gml:MultiPoint are mapped to the records of the file in sequential order.
</documentation>
		</annotation>
	</element>
	<element name="MultiCurveCoverage" type="gml:DiscreteCoverageType" substitutionGroup="gml:AbstractDiscreteCoverage">
		<annotation>
			<documentation>In a gml:MultiCurveCoverage the domain is partioned into a collection of curves comprising a gml:MultiCurve.  The coverage function then maps each curve in the collection to a value in the range set.
The content model is identical with gml:DiscreteCoverageType, but that gml:domainSet shall have values gml:MultiCurve.
In a gml:MultiCurveCoverage the mapping from the domain to the range is straightforward.
-	For gml:DataBlock encodings the curves of the gml:MultiCurve are mapped in document order to the tuples of the data block.
-	For gml:CompositeValue encodings the curves of the gml:MultiCurve are mapped to the members of the composite value in document order.
-	For gml:File encodings the curves of the gml:MultiCurve are mapped to the records of the file in sequential order.
</documentation>
		</annotation>
	</element>
	<element name="MultiSurfaceCoverage" type="gml:DiscreteCoverageType" substitutionGroup="gml:AbstractDiscreteCoverage">
		<annotation>
			<documentation>In a gml:MultiSurfaceCoverage the domain is partioned into a collection of surfaces comprising a gml:MultiSurface.  The coverage function than maps each surface in the collection to a value in the range set.
The content model is identical with gml:DiscreteCoverageType, but that gml:domainSet shall have values gml:MultiSurface.
In a gml:MultiSurfaceCoverage the mapping from the domain to the range is straightforward.
-	For gml:DataBlock encodings the surfaces of the gml:MultiSurface are mapped in document order to the tuples of the data block.
-	For gml:CompositeValue encodings the surfaces of the gml:MultiSurface are mapped to the members of the composite value in document order.
-	For gml:File encodings the surfaces of the gml:MultiSurface are mapped to the records of the file in sequential order.
</documentation>
		</annotation>
	</element>
	<element name="MultiSolidCoverage" type="gml:DiscreteCoverageType" substitutionGroup="gml:AbstractDiscreteCoverage">
		<annotation>
			<documentation>In a gml:MultiSolidCoverage the domain is partioned into a collection of solids comprising a gml:MultiSolid.  The coverage function than maps each solid in the collection to a value in the range set.
The content model is identical with gml:DiscreteCoverageType, but that gml:domainSet shall have values gml:MultiSolid.
In a gml:MultiSolidCoverage the mapping from the domain to the range is straightforward.
-	For gml:DataBlock encodings the solids of the gml:MultiSolid are mapped in document order to the tuples of the data block.
-	For gml:CompositeValue encodings the solids of the gml:MultiSolid are mapped to the members of the composite value in document order.
-	For gml:File encodings the solids of the gml:MultiSolid are mapped to the records of the file in sequential order.
</documentation>
		</annotation>
	</element>
	<element name="GridCoverage" type="gml:DiscreteCoverageType" substitutionGroup="gml:AbstractDiscreteCoverage">
		<annotation>
			<documentation>A gml:GriddedCoverage is a discrete point coverage in which the domain set is a geometric grid of points.
Note that this is the same as the gml:MultiPointCoverage except that we have a gml:Grid to describe the domain.
The simple gridded coverage is not geometrically referenced and hence no geometric positions are assignable to the points in the grid. Such geometric positioning is introduced in the gml:RectifiedGridCoverage.</documentation>
		</annotation>
	</element>
	<element name="RectifiedGridCoverage" type="gml:DiscreteCoverageType" substitutionGroup="gml:AbstractDiscreteCoverage">
		<annotation>
			<documentation>The gml:RectifiedGridCoverage is a discrete point coverage based on a rectified grid. It is similar to the grid coverage except that the points of the grid are geometrically referenced. The rectified grid coverage has a domain that is a gml:RectifiedGrid geometry.</documentation>
		</annotation>
	</element>
</schema>
